#include "uart.h"
#include "types.h"  // 包含基本类型定义
#include "riscv.h"

// UART寄存器地址
#define UART_BASE 0x10000000L
#define UART_THR (volatile uint8*)(UART_BASE + 0x00) // 发送保持寄存器
#define UART_RHR (volatile uint8*)(UART_BASE + 0x00) // 接收保持寄存器
#define UART_LSR (volatile uint8*)(UART_BASE + 0x05) // 线路状态寄存器

// 初始化UART（QEMU virt机器通常已初始化好）
void uart_init(void) {
    // 实际硬件可能需要配置波特率等参数
}

// 检查发送是否就绪
int uart_tx_ready(void) {
    return (*UART_LSR & 0x20) != 0;
}

// 检查接收是否有数据
int uart_rx_ready(void) {
    return (*UART_LSR & 0x01) != 0;
}

void uart_putc(char c) {
    while (!uart_tx_ready());  // 等待发送就绪
    *UART_THR = c;
}

int uart_getc(void) {
    if (uart_rx_ready()) {
        return *UART_RHR;
    }
    return -1;
}

void uart_puts(const char *s) {
    while (*s) {
        uart_putc(*s++);
    }
}

void uart_handle(void) {
    int c = uart_getc();
    if (c != -1) {
        uart_putc(c); // 简单回显
    }
}
